<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=545812

Test DOM fullscreen API.

-->
<head>
  <title>Test for Bug 545812</title>
  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
  <script type="application/javascript" src="file_fullscreen-utils.js"></script>
  <style>
  body {
    background-color: black;
  }
  </style>
</head>
<body>

<script type="application/javascript">

/** Test for Bug 545812 **/

function ok(condition, msg) {
  opener.ok(condition, "[denied] " + msg);
}

function is(a, b, msg) {
  opener.is(a, b, "[denied] " + msg);
}

const INNER_FILE = "file_fullscreen-denied-inner.html";
function setupForInnerTest(targetName, callback) {
  window.testTargetName = targetName;
  window.continueTest = () => {
    delete window.testTargetName;
    delete window.continueTest;
    callback();
  };
}

function begin() {
  document.addEventListener("fullscreenchange", () => {
    ok(false, "Should never receive " +
       "a fullscreenchange event in the main window.");
  });
  SimpleTest.executeSoon(testIFrameWithoutAllowFullscreen);
}

function testIFrameWithoutAllowFullscreen() {
  // Create an iframe without an allowfullscreen attribute, whose
  // contents request fullscreen. The request should be denied, and
  // we should not receive a fullscreenchange event in this document.
  var iframe = document.createElement("iframe");
  iframe.src = INNER_FILE;
  setupForInnerTest("an iframe without allowfullscreen", () => {
    document.body.removeChild(iframe);
    SimpleTest.executeSoon(testFrameElement);
  });
  document.body.appendChild(iframe);
}

function testFrameElement() {
  var frameset = document.createElement("frameset");
  var frame = document.createElement("frame");
  frame.src = INNER_FILE;
  frameset.appendChild(frame);
  setupForInnerTest("a frame element", () => {
    document.documentElement.removeChild(frameset);
    SimpleTest.executeSoon(testObjectElement);
  });
  document.documentElement.appendChild(frameset);
}

function testObjectElement() {
  var objectElem = document.createElement("object");
  objectElem.data = INNER_FILE;
  setupForInnerTest("an object element", () => {
    document.body.removeChild(objectElem);
    // In the following tests we want to test trust context requirement
    // of fullscreen request, so temporary re-enable this pref.
    SpecialPowers.pushPrefEnv({
      "set":[["full-screen-api.allow-trusted-requests-only", true]]
    }, testNonTrustContext);
  });
  document.body.appendChild(objectElem);
}

function testNonTrustContext() {
  addFullscreenErrorContinuation(() => {
    ok(!document.fullscreenElement,
       "Should not grant request in non-trust context.");
    SimpleTest.executeSoon(testLongRunningEventHandler);
  });
  document.documentElement.requestFullscreen();
}

function testLongRunningEventHandler() {
  function longRunningHandler() {
    window.removeEventListener("keypress", longRunningHandler);
    // Busy loop until 2s has passed. We should then be past the one
    // second threshold, and so our request for fullscreen should be
    // rejected.
    var end = (new Date()).getTime() + 2000;
    while ((new Date()).getTime() < end) {
      ; // Wait...
    }
    document.documentElement.requestFullscreen();
  }
  addFullscreenErrorContinuation(() => {
    ok(!document.fullscreenElement,
       "Should not grant request in long-running event handler.");
    // Restore the pref environment we changed before
    // entering testNonTrustContext.
    SpecialPowers.popPrefEnv(finish);
  });
  window.addEventListener("keypress", longRunningHandler);
  synthesizeKey("VK_A", {});
}

function finish() {
  opener.nextTest();
}

</script>
</body>
</html>
